home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World Komputer 2007 December
/
PCWKCD1207B.iso
/
+ TYLKO W WERSJI CYFROWEJ +
/
PCWK_PROG
/
Source
/
120
/
ukryte2
/
fukryte2.cpp
next >
Wrap
C/C++ Source or Header
|
2007-07-05
|
7KB
|
234 lines
//
// Andrzej Stasiewicz, czerwiec, 2007
// Ukrywanie obrazu w obrazie
// Oszacowanie miejsca w tajnym schowku
// Wpisanie obrazu w m│odsze bity obrazu - no£nika
//
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "fukryte2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
il_r = il_g = il_b = 3; //stan pocz╣tkowy pojemno£ci schowka uzgodniono z edytorkami
}
//---------------------------------------------------------------------------
// Odczyt pliku, wy£wietlenie z lewej strony, wyr≤wnanie parametr≤w
// obrazu docelowego, oszacowanie pojemno£ci schowka
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if( OpenPictureDialog1 -> Execute())
{
Image1 -> Picture -> LoadFromFile( OpenPictureDialog1 -> FileName);
Image1 -> Picture -> Bitmap -> PixelFormat = pf32bit;
Image3 -> Picture -> Bitmap -> PixelFormat = pf32bit;
int szer = Image1 -> Picture -> Bitmap -> Width;
int wys = Image1 -> Picture -> Bitmap -> Height;
Image3 -> Picture -> Bitmap -> Width = szer;
Image3 -> Picture -> Bitmap -> Height = wys;
int rozmiar = szer * wys * ( il_r + il_g + il_b) / 8;
Label4 -> Caption = "Przestrze± dostΩpna: " + String( rozmiar);
}
}
//---------------------------------------------------------------------------
// Odczyt pliku ukrywanego, wykazanie jego rozmiaru
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if( OpenPictureDialog1 -> Execute())
{
Image2 -> Picture -> LoadFromFile( OpenPictureDialog1 -> FileName);
Image2 -> Picture -> Bitmap -> PixelFormat = pf32bit;
int szer = Image2 -> Picture -> Bitmap -> Width;
int wys = Image2 -> Picture -> Bitmap -> Height;
int rozmiar = szer * wys * 4;
Label5 -> Caption = "Przestrze± wymagana: " + String( rozmiar);
}
}
//---------------------------------------------------------------------------
// Oszacowanie dostΩpnej przestrzeni
// Ukrywanie obrazka Image2 w obrazku Image1
// i pokazanie wyniku w Image3.
// Najpierw Image1 jest kopiowany do Image3.
// Potem okre£lone bity Image3 s╣ modyfikowane.
void __fastcall TForm1::Button3Click(TObject *Sender)
{
Image3 -> Picture -> Bitmap = Image1 -> Picture -> Bitmap;
int i, j, n, szer, wys;
TColor k;
unsigned char r, g, b;
int val;
X_POZ = 0; //start
Y_POZ = 0;
RGB_POZ = 0;
BIT_POZ = 0;
szer = Image2 -> Picture -> Bitmap -> Width;
wys = Image2 -> Picture -> Bitmap -> Height;
for( i = 0; i < szer; ++i)
{
for( j = 0; j < wys; ++j)
{
k = Image2 -> Picture -> Bitmap -> Canvas -> Pixels[ i][ j];
r = GetRValue( k);
for( n = 0; n < 8; ++n)
{
val = daj_bit( r, n);
if( !zapisz_bit( val))
return;
}
g = GetGValue( k);
for( n = 0; n < 8; ++n)
{
val = daj_bit( g, n);
if( !zapisz_bit( val))
return;
}
b = GetBValue( k);
for( n = 0; n < 8; ++n)
{
val = daj_bit( b, n);
if( !zapisz_bit( val))
return;
}
}
}
}
//---------------------------------------------------------------------------
// Zapis ostatecznego obrazka do pliku
void __fastcall TForm1::Button4Click(TObject *Sender)
{
if( SavePictureDialog1 -> Execute())
{
Image3 -> Picture -> SaveToFile( SavePictureDialog1 -> FileName);
}
}
//---------------------------------------------------------------------------
// oddaj stan 0, 1, zgodnie z bitem poz w bajcie bajt
int TForm1 :: daj_bit( unsigned char bajt, int poz)
{
int ret;
unsigned char maska[ 8] = {1, 2, 4, 8, 16, 32, 64, 128}; //'1', '10', '100', '1000', ...
if( bajt & maska[ poz])
ret = 1;
else
ret = 0;
return ret;
}
//---------------------------------------------------------------------------
// Funkcja elementarna.
// W bajcie 'bajt' nadaj bitowi 'poz' wartosc 'bit'
unsigned char TForm1 :: ustaw_bit( unsigned char bajt, int poz, int bit)
{
unsigned char maska[ 8] = {1, 2, 4, 8, 16, 32, 64, 128}; //'1', '10', '100', '1000', ...
if( bit == 1) //wpisywanie jedynki
{
bajt = bajt | maska[ poz];
}
else
{
bajt = bajt & (~maska[ poz]);
}
return bajt;
}
//---------------------------------------------------------------------------
// Zapisz wartosc bit (=0, 1) w bie┐╣cym bicie obrazka g│≤wnego Image3
// (kt≤ry jest kopi╣ Image1)
// Dokonaj przesuniΩcia wskaƒnik≤w pozycji bie┐╣cego bitu w Image3
// return: true - zapisano,
// false - koniec obrazka g│≤wnego.
bool TForm1 :: zapisz_bit( int bit)
{
int szer = Image3 -> Picture -> Bitmap -> Width;
int wys = Image3 -> Picture -> Bitmap -> Height;
if( Y_POZ > wys)
return false; //koniec przestrzeni do zapisu
TColor k = Image3 -> Picture -> Bitmap -> Canvas -> Pixels[ X_POZ][ Y_POZ];
unsigned char r = GetRValue( k);
unsigned char g = GetGValue( k);
unsigned char b = GetBValue( k);
switch( RGB_POZ)
{
case 0:
r = ustaw_bit( r, BIT_POZ, bit);
break;
case 1:
g = ustaw_bit( g, BIT_POZ, bit);
break;
case 2:
b = ustaw_bit( b, BIT_POZ, bit);
break;
}
k = RGB( r, g, b);
Image3 -> Picture -> Bitmap -> Canvas -> Pixels[ X_POZ][ Y_POZ] = k;
BIT_POZ ++; //nastΩpny wskaƒniki na nastΩpny bit ...
if( RGB_POZ == 0) //... ale czy mie£ci siΩ w kanale R?
{
if( BIT_POZ >= il_r)
{
BIT_POZ = 0;
RGB_POZ = 1; //... je£li nie, przejdƒmy do kana│u G...
}
}
if( RGB_POZ == 1) //... ale czy mie£ci siΩ w kanale G? ...
{
if( BIT_POZ >= il_g)
{
BIT_POZ = 0;
RGB_POZ = 2; //... je£li nie, przejdƒmy do kana│u B ...
}
}
if( RGB_POZ == 2) //... ale czy mie£ci siΩ w kanale B? ...
{
if( BIT_POZ >= il_b)
{
BIT_POZ = 0;
RGB_POZ = 0;
X_POZ ++; //... je£li nie, przejdƒmy do nastΩpnego piksela
if( X_POZ >= szer)
{
X_POZ = 0;
Y_POZ ++;
}
}
}
return true;
}
//---------------------------------------------------------------------------
// Zmieniono nastawy edytork≤w - rozmiar≤w schowka
void __fastcall TForm1::Edit3Exit(TObject *Sender)
{
il_r = Edit1 -> Text.ToInt(),
il_g = Edit2 -> Text.ToInt(),
il_b = Edit3 -> Text.ToInt();
int szer = Image1 -> Picture -> Bitmap -> Width;
int wys = Image1 -> Picture -> Bitmap -> Height;
int rozmiar = szer * wys * ( il_r + il_g + il_b) / 8;
Label4 -> Caption = "Przestrze± dostΩpna: " + String( rozmiar);
}
//---------------------------------------------------------------------------